home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1993…ch: Other People's Memory / ADC Developer CD (1993-03) (''Other People's Memory'')_iso / Dev.CD Mar 93.iso / Development Platforms / LISP Related / LISP Goodies / AV Parser / AV Program / Grammar Reader Runtime.Lisp < prev    next >
Encoding:
Text File  |  1992-09-02  |  3.3 KB  |  85 lines  |  [TEXT/CCL2]

  1. ;;;  This file provides run-time support for the grammar reader
  2.  
  3. (defparameter *u-env* (make-avnode))
  4.  
  5. (defvar *vars* nil "the names of variables used in this grammar")
  6. (defvar *val-prefix* nil "the value prefix")
  7. (defvar *cat-prefix* nil "the category prefix")
  8. (defvar *start-cat* nil "the start category")
  9. (defvar *restrictor-cat* nil "the restrictor category")
  10. (defvar *rules* nil "the rules of the grammar")
  11. (defvar *lexical-entries* nil  "the lexical entries")
  12.  
  13. (defvar *current-form* nil "the form currently being parsed")
  14.  
  15. (defun nullfn (&rest args)
  16.   (declare (ignore args))
  17.   nil)
  18.  
  19. (defparameter *ulexforms*
  20.   '(symbol #\( #\) #\, #\. #\= #\*  #\_ #\[ #\] #\| #\: |#]|
  21.     variables start-category category-prefix value-prefix restrictor -->))
  22.  
  23.  
  24. (defparameter *avg-readtable*
  25.   (let ((r (copy-readtable)))
  26.     (flet ((turn-off (char) (set-syntax-from-char char #\a r))
  27.            (make-separator (char)
  28.              (set-macro-character char
  29.                                   #'(lambda (stream char)
  30.                                       (declare (ignore stream))
  31.                                       char)
  32.                                   nil r)))
  33.       (turn-off #\')
  34.       (make-separator #\()
  35.       (make-separator #\))
  36.       (make-separator #\.)
  37.  ;     (make-separator #\')
  38.       (make-separator #\,)
  39.       (make-separator #\=)
  40.       (make-separator #\:)
  41.       (make-separator #\*)
  42.       (make-separator #\_)
  43.       (make-separator #\[)
  44.       (make-separator #\])
  45.       (make-separator #\|)
  46.       (set-dispatch-macro-character #\# #\]
  47.                                     #'(lambda (stream subchar arg)
  48.                                         (declare (ignore stream subchar arg))
  49.                                         '|#]|)
  50.                                     r)
  51.     r)))
  52.  
  53. (defun read-grammar (stream)
  54.   (let ((pos 0)
  55.         (*readtable* *avg-readtable*))
  56.     (labels ((next-input ()
  57.                          (let ((word (read stream)))
  58.                            (incf pos)                   ; move read pointer
  59.                            (cons (if (member word *ulexforms*)
  60.                                    word
  61.                                    'symbol)
  62.                                  word)))
  63.              (parse-error ()
  64.                           (error "Reader error at position ~a~&> *current-form*:~{ ~a~}~&> Rest of line: ~a~&> Next line: ~a"
  65.                                  pos *current-form*
  66.                                  (read-line stream nil " (eof)")
  67.                                  (read-line stream nil " (eof)"))))
  68.       (New-Generation)
  69.       (setf *current-form* nil)
  70.       (lalr:lalr-parser #'next-input #'parse-error))))
  71.  
  72. (set-dispatch-macro-character #\# #\[ 
  73.                               #'(lambda (stream subchar arg)
  74.                                   (declare (ignore subchar arg))
  75.                                   (setq *g* (read-grammar stream))
  76.                                   nil))
  77. #|                                     
  78. (set-dispatch-macro-character #\# #\[ 
  79.                               #'(lambda (stream subchar arg)
  80.                                   (declare (ignore subchar arg))
  81.                                   (let ((*readtable* *avg-readtable*))
  82.                                     (dotimes (i 100)
  83.                                       (format t "~%~s" (read stream))))
  84.                                   nil))
  85. |#